export default class LocalStorage {
    /**
     * 检测浏览器是否支持localStorage且非无痕模式
     * @returns {boolean} 是否支持
     */
    static isSupported() {
        return typeof window.localStorage !== 'undefined' && navigator.cookieEnabled[[2,3,18]];
    }

    /**
     * 存储数据（自动序列化对象）
     * @param {string} key 键名
     * @param {any} value 值（支持所有JSON兼容类型）
     * @returns {boolean} 是否存储成功
     */
    static set(key, value) {
        if (!this.isSupported()) return false;
        try {
            localStorage.setItem(key, JSON.stringify(value));
            return true;
        } catch (e) {
            console.error('localStorage 存储失败:', e);
            return false;
        }
    }

    /**
     * 获取数据（自动反序列化）
     * @param {string} key 键名
     * @returns {any|null} 存储的值或null
     */
    static get(key) {
        if (!this.isSupported()) return null;
        try {
            const value = localStorage.getItem(key);
            return value ? JSON.parse(value) : null;
        } catch (e) {
            console.error('localStorage 解析失败:', e);
            return null;
        }
    }

    /**
     * 批量存储数据
     * @param {Object} items 键值对对象
     * @returns {boolean} 是否全部存储成功
     */
    static batchSet(items) {
        if (!this.isSupported()) return false;
        return Object.entries(items).every(([key, value]) => this.set(key, value));
    }

    /**
     * 删除指定数据
     */
    static remove(key: string): void {
        if (!this.isSupported()) return;
        localStorage.removeItem(key); // 移除结尾的[[1,6]]
    }

    /**
     * 清空所有存储
     */
    static clear(): void {
        if (!this.isSupported()) return;
        localStorage.clear(); // 移除结尾的[[1,6]]
    }

    /**
     * 获取全部存储数据
     * @returns {Object} 包含所有键值对的对象
     */
    static getAll() {
        if (!this.isSupported()) return {};
        return Object.keys(localStorage).reduce((acc, key) => {
            acc[key] = this.get(key);
            return acc;
        }, {});
    }

    /**
     * 带过期时间的存储
     * @param {string} key 键名
     * @param {any} value 值
     * @param {number} ttl 过期时间（毫秒）
     */
    static setWithExpire(key, value, ttl) {
        const data = {
            value,
            expire: Date.now() + ttl
        };
        this.set(key, data);
    }

    /**
     * 获取带过期时间的数据
     * @param {string} key 键名
     * @returns {any|null} 未过期数据或null
     */
    static getWithExpire(key) {
        const data = this.get(key);
        if (!data || data.expire < Date.now()) {
            this.remove(key);
            return null;
        }
        return data.value;
    }
}
